package com.learning.rpc.rpc.protocol.lrpc.handler;

import com.learning.rpc.remoting.Handler;
import com.learning.rpc.remoting.RpcChannel;
import com.learning.rpc.rpc.Response;

import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;

/**
 * ClassName: LrpcClientHandler
 * Description: LRPC 协议的客户端处理器
 * Date: 2022/5/16 17:29 【需求编号】
 *
 * @author Sam Sho
 * @version V1.0.0
 */
public class LrpcClientHandler implements Handler {

    private static final Map<Long, CompletableFuture> invokerMap = new ConcurrentHashMap<>();

    /**
     * 登记一下， 创建返回一个future -- 每一个等待结果的线程一个单独的future
     *
     * @param messageId
     * @return
     */
    public static CompletableFuture waitResult(long messageId) {
        CompletableFuture future = new CompletableFuture();
        invokerMap.put(messageId, future);
        return future;
    }

    /**
     * TODO 客户端而已，收到 响应 --- 方法执行的返回值
     *
     * @param rpcChannel
     * @param message
     * @throws Exception
     */
    @Override
    public void onReceive(RpcChannel rpcChannel, Object message) throws Exception {
        Response response = (Response) message;
        // 接收所有的结果 -- 和 invoker调用者不在一个线程
        // 根据id  和 具体 的请求对应起来 complete发送
        invokerMap.get(response.getRequestId()).complete(response);
        invokerMap.remove(response.getRequestId());
    }

    @Override
    public void onWrite(RpcChannel rpcChannel, Object message) throws Exception {

    }
}
